package lanQiaoBei.搜索与图论.二分图;

import java.io.*;
import java.math.*;
import java.util.*;

/*深度优先遍历判断是否为二分图（染色法）
*给定一个 n 个点 m 条边的无向图，图中可能存在重边和自环。

请你判断这个图是否是二分图。

输入格式
第一行包含两个整数 n 和 m。

接下来 m 行，每行包含两个整数 u 和 v，表示点 u 和点 v 之间存在一条边。

输出格式
如果给定图是二分图，则输出 Yes，否则输出 No。

数据范围
1≤n,m≤10^5
输入样例：
5 4
1 2
1 4
4 3
3 6
输出样例：
Yes
* */
public class P1 {
       static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
       final static int N=100010,M=2*N;
       static int h[]=new int[N],e[]=new int[M],ne[]=new int[M],color[]=new int[N],idx,n,m;
       
       static void add(int a,int b){
    	      e[idx]=b;ne[idx]=h[a];h[a]=idx++;
       }
       static boolean dfs(int dot,int c){
    	      color[dot]=c;//将该点染成c色
		      for(int i=h[dot];i!=-1;i=ne[i]){
				  int j=e[i];
				  if(color[j]==0){//如果该点没有被染过色
					  boolean flag=dfs(j,3-c);//染成相反颜色
					  if(!flag)return false;//如果递归染色不成功则返回false
				  }else if(color[j]==c)return false;//如果该点被染过色且该点的颜色与相邻节点的颜色一致则不可能构成二分图 返回false
			  }
			  return true;//如果所有点都能够染色成功则可以构成二分图
       }
       public static void main(String[] ss) throws IOException {
		      ss=br.readLine().split(" ");
		      n=Integer.parseInt(ss[0]);m=Integer.parseInt(ss[1]);
		      Arrays.fill(h, -1);
		      while(m-->0){
		    	  ss=br.readLine().split(" ");
		    	  int a=Integer.parseInt(ss[0]),b=Integer.parseInt(ss[1]);
		    	  add(a,b);
		    	  add(b,a);
		      }
		      boolean flag=true;
		      for(int i=1;i<=n;i++){
		    	  if(color[i]==0){
		    		  flag=dfs(i,1);
		    		  if(!flag)break;
		    	  }
		      }
		      if(flag)System.out.print("Yes");
		      else System.out.print("No");
	  }
}
